package ar.com.jsejtman.cajugastos2.core.dao;

import ar.com.jsejtman.cajugastos2.core.entity.Empresa;
import ar.com.jsejtman.common.persistence.dao.GenericDao;
import ar.com.jsejtman.common.persistence.dao.PaginatedCriteria;
import ar.com.jsejtman.common.persistence.exception.DaoException;
import ar.com.jsejtman.common.service.data.DataPage;
import ar.com.jsejtman.common.service.data.SortCriterion;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

/**
 * DAO correspondiente a la entidad de datos Empresa. Permite realizar operaciones generales de
 * lectura y escritura, así como operaciones específicas de esta entidad de datos.
 * 
 * @author jsejtman
 */
public class EmpresaDao extends GenericDao<Empresa, Long> {

	/**
	 * Realiza una búsqueda de empresa por varios criterios de búsqueda.
	 * 
	 * @param cuit Criterio de CUIT para búsqueda.
	 * @param razonSocial Criterio de razón social para búsqueda.
	 * @param pageNumber Número de página a obtener.
	 * @param pageSize Tamaño de página a obtener.
	 * @param sortCriterion Criterio de ordenamiento (si corresponde).
	 * @return Página de datos hallada.
	 * @throws DaoException En caso de problemas durante la búsqueda de la página.
	 */
	public final DataPage<Empresa> searchEmpresa(final String cuit, final String razonSocial,
	        final Integer pageNumber, final Integer pageSize, final SortCriterion sortCriterion)
	        throws DaoException {

		if (cuit == null && razonSocial == null) {
			throw new DaoException("Un criterio de búsqueda es requerido.");
		}

		try {
			final Criteria searchCriteria = this.getSession().createCriteria(Empresa.class);

			if (cuit != null) {
				searchCriteria.add(Restrictions.eq("cuit", cuit));
			}

			if (razonSocial != null) {
				searchCriteria.add(Restrictions.like("razonSocial", "%" + razonSocial + "%"));
			}

			final PaginatedCriteria<Empresa> paginatedCriteria =
			        new PaginatedCriteria<Empresa>();
			
			paginatedCriteria.setCriteria(searchCriteria);
			paginatedCriteria.setPageNumber(pageNumber);
			paginatedCriteria.setPageSize(pageSize);
			paginatedCriteria.setSortCriterion(sortCriterion);

			return (paginatedCriteria.getDataPage());

		} catch (final HibernateException e) {
			throw new DaoException(e);
		}
	}
}
